package com.cn.mybatis.plugin;

import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.*;

import java.sql.Connection;
import java.util.Properties;

/**
 * 自定义插件类
 * 可以实现(Executor、StatementHandler、ParameterHandler、ResultSetHandler)四大核心组件的功能增强
 * 每个插件可以视作一个拦截器
 *
 * 配置步骤： 1、编写自定义插件类
 *          2、 配置文件添加
 *          <plugins>
 *              <plugin interceptor="com.lagou.plugin.MySqlPagingPlugin"> // 当前类相对路径
 *                  <property name="name" value="Bob"/> // 参数
 *              </plugin>
 *          </plugins>
 */
@Intercepts({
        // 类.方法.参数 来确认唯一方法
        @Signature(type = StatementHandler.class,//拦截的目标类
                method = "prepare", // 拦截的方法名称
                args = {Connection.class, Integer.class} // 方法的参数。
                )
})
public class MyPlugin implements Interceptor {

    /**
     * 通过反射，调用目标方法的前后，都可以进行方法增强
     * @param invocation 执行器
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        System.out.println("执行方法前。。。");
        // 执行原方法
        Object proceed = invocation.proceed();
        System.out.println("执行方法后。。。");
        return proceed;
    }

    /**
     * 将插件注册到拦截器链中
     * @param o
     * @return
     */
    @Override
    public Object plugin(Object o) {
        // 将当前类注册到Plugin链中去
        Object wrap = Plugin.wrap(o, this);
        return wrap;
    }

    /**
     * 配置参数获取
     * @param properties 配置参数
     */
    @Override
    public void setProperties(Properties properties) {
        System.out.println("插件配置的参数：" + properties);
    }
}
